package kuonjisai;

public class J15_OOP1 {


	// 객체지향 개발 기법
	// OOP( Object Orianted Programing ) : 객체를 기반으로 프로그램을 작성하는 것
	// OOP 언어로 응용 프로그램을 개발하는 경우,
	// 문제 해결을 위해 실제 상황과 유사한 모델을
	// 만들어야 함
	
	// 예를 들어, 직원 세금을 계산하는 프로그램 작성
	// 프로그램에서 회사를 표현하는 회사객체가 필요
	// 또한, 직원을 나타내는 직원객체, 세금을 나타내는
	// 세금객체도 필요
	
	// 회사, 직원, 세금 객체를 자바 프로그램에서
	// 코드로 나타내는 방법에 대해 알아봄
	
	// 모든 객체에는 가지 성질이 있음
	// [속성property], 객체가 할 수 있는 [행동action]
	// 현실세계에 존재하는 객체를 자바언어로 가져오는 경우에도
	// 속성과 행위를 가지고 있어야 함
	// 자바에서 속성은 field, 행위는 method 라 함
	// 단, 필드와 메서드는 선택사항(생략가능) 임
	
	// 자바 객체를 만드는 방법은 ? - 설계도를 이용
	// 차 라는 객체를 잘 만들려면
	// 좋은 차를 만들어 주는 [설계도]를 참고
	// OOP 에서 객체를 만들어 주는 설계도를 [클래스]라 함
	
	// 클래스는 동일한 유형의 객체를 만드는
	// 청사진/설계도 또는 템플릿임( 중요!_)
	// 붕어빵 - 객체
	// 붕어빵 틀 - 클래스
	// 밀가루 , 판 : 속성 서이
	// 클래스는 당신이 만들ㄹ려는 객체의 종류를 결정함
	
	// 요약하자면, 클래스는 프로그래머로 하여금
	// 문제의 추상화를 만들 수 있게 해주는 OOP 도구임
	// OOP에서 추상화abstraction은 실제 객체를 표현하기
	//위해 실제 객체에서 핵심적인 개녕  또는 기능을 뽑아
	// 프로그래밍 객체로 만드는 행위를 말함
	
	//클래스는 자바 프로그램의 기본 뼈대
	// 자바 초보자는 클래스ㅡㄹㄹ 작성할 때
	// 클래스 이름, 필드, 메서드 등을 고려할 것
	
	// 클래스 만들기
	//class 클래스이름 {
	//	클래스몸체 (필드, 메서드)
	//}
	
	
	public static void main(String[] args) {
	/*	// 클래스를 사용하지 않고 학생 객체
		String name1 = "김태희";
		int stdno1 = 123456;
		String addr1 = "부산 남구 문현동";
		int mp1 = 123654;
		
		String name2 = "하르방";
		int stdno2 = 358963;
		String addr2 = "한라산 화강암 지하 300M";
		int mp2 = 448796;
		
			
		
		
		// 클래스를 이용해서 학생 객체 생성
		Student jaehoon = new Student();
		jaehoon.name = "최재훈";
		jaehoon.stdno = 6589;
		jaehoon.addr = "서울 양천 신정동";
		jaehoon.mp = 9755;
				
		Student hiseok = new Student();
		hiseok.name = "회석";
		hiseok.stdno = 22;
		hiseok.addr = "경기도 부천";
		hiseok.mp = 4831;
		*/
		
		// 생성자를 이용한 학생 객체 생성
		Student one = new Student();
		System.out.println( one.name );
		System.out.println( one.addr );
		System.out.println( one.mp );
		System.out.println( one.stdno );
		
		Student two = new Student();
		System.out.println( two.name );
		System.out.println( two.addr );
		System.out.println( two.mp );
		System.out.println( two.stdno );
		
		
		
		
		
		
		
		
	} // main
}  // class       

// 클래스의 이름은 반드시 대문자로 시작 - 파스칼영문법 
// 클래스 정의시 클래스 이름과 파일 이름은
// 동일해야함 
// 클래스 내에 선언된 변수를 필드field라 함
// public 빼고 쓰면은 하나의 파일에다가 여러개의 클래스 사용가능 

// 학생 클래스 정의
class Student {
	// 필드 선언 (맴버변수)
	String name;
	int stdno;
	String addr;
	int mp;
	
	// 생성자 추가 - 객체를 초기화하는데 사용 
	public Student(){
		stdno = 12345;
		name = "아무개";
		addr = "서우루";
		mp = 98765;
		
	} // 생성자 student
	
} // s
// 고객 (Customer) 클래스에 대해 정의
// 아이디, 비밀번호, 이름, 주소, 전화번호, 이메일
class Customer{
	String userid;
	String passwd;
	String name;
	String addr;
	String mp;
	String email;
	
	// 생성자
	public Customer(){
		userid = "asd";
		passwd = "fuckyou";
		name = "lol";
		addr = "the sun";
		mp = "1577-1577";
		email = "sohot@hotmail.com";
	} // pbCustomer
	
}

// 상품 (Product) 클래스
// 상품번호, 상품명, 가격, 종류, 제조사, 
class Product{
	int pno;
	String pname;
	int price;
	String ptype;
	String maker;
	
	public Product(){
		pno = 1;
		pname = "해볼라고";
		price = 10000;
		ptype = "힙합";
		maker = "형용돈죵";
	} //pbProduct
}


// 스타크래프트 2의 테란 유닛(TerranUnit)을 클래스로 정의
// 생명력, 에너지, 방어멱
// 광물, 베스핀, 보급품, 생산시간
class TerranUnit{
	int life;
	int energy;
	int shield;
	int mineral;
	int gas;
	int supply;
	int time;
	
	// 해병은 기본입니다.
	public TerranUnit() {
		life = 50;
		energy = 0;
		shield = 0;
		mineral = 50;
		gas = 0;
		supply = 1;
		time = 25;
	} //pbTerranUnit
	
} //TerranUnit
